<?php
class TurnsController extends AppController {

	var $name = 'Turns';
	var $uses = array('Turn','Person','Stateturn', 'Product','Agenda','User');
	var $actsAs = array('Acl' => array('type' => 'controlled'));

    function beforeFilter () {
        parent::beforeFilter();

		// Aplico el Layout segun la Vista o si es AJAX
		if ($this->RequestHandler->isAjax()) {
			$this->layout = 'ajax';
		}else{
			// Cambio la Vista por la del Rol
			$this->layout = strtolower($this->Session->read('VistaActual'));
		}
    }

	function index($id_paciente = null, $archivados = null) {
		$this->Turn->recursive = 0;

		if(!$archivados){
			$turns = $this->Turn->find('all', array(
							'conditions' => array(
												'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
												'Turn.person_id' => $id_paciente,
												'NOT' => array ('Turn.staterecord_id' => array('2','3'))
											)
			) );
		}else{ // Para mostrar tambien los registros ARCHIVADOS
			$turns = $this->Turn->find('all', array(
							'conditions' => array(
												'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
												'Turn.person_id' => $id_paciente,
												'NOT' => array ('Turn.staterecord_id' => array('2'))
											)
			) );
		}
		$this->set('archivados', $archivados);

		$this->set('doctores',$this->requestAction('/users/obtenerListadoDoctores/'.$this->Session->read('ClientesUsuarioLogueado.id')) );
		$this->set('turns', $turns);
		$this->set('id_paciente', $id_paciente);
		$this->layout = 'ajax';
	}

	function view($id = null) {
		if (!$id) {
			$this->Session->setFlash(__('Invalid turn', true));
			$this->redirect(array('action' => 'index'));
		}
		$this->set('turn', $this->Turn->read(null, $id));
	}

	
	
	
	function add($anio = null, $mes = null, $dia = null, $hora = null, $minutos = null, $id_profesional = null, $sobreturno = "N",$id_paciente = null,$id_agenda = 0) {

		$this->_accede('carga_turnos');

		if (!empty($this->data)) {
			//pr($this->data); die();
			// Si no fue marcado que es paciente temporario
			if( empty($this->data['Turn']['apellido']) ){
				$esPacienteTemporario = "N";
				$nota_json = '';				
				$nota      = '';
			}else{
				$esPacienteTemporario = "S";
				$x = $this->data['Turn'];
				$nota = $x['apellido'].', '.$x['nombre'].'<br/>Email:'.$x['email'].'<br/>Telefono:'.$x['telefono'].'<br/>Financiador:'.$x['financiador'];
				// Estas notas json se utilizan para pre-cargar los datos del paciente en el formulario de alta
				$nj['lastname']         = $x['apellido'];
				$nj['name']             = $x['nombre'];
				$nj['email']            = $x['email'];
				$nj['telefono']         = $x['telefono'];
				$nj['financiador']         = $x['financiador'];
				$nota_json = json_encode($nj);
			}


			
			// Si no fue marcado que es sobreturno
			if(empty($this->data['Turn']['sobreturno'])){
				$esSobreturno = "N";
			}else{
				$esSobreturno = "S";
			}

			// Si el Paciente no se selecciono y el Paciente no es Temporario
			if(empty($this->data['Turn']['person_id']) AND $esPacienteTemporario == "N"){
				$this->Session->setFlash(__('Debe seleccionar un Paciente', true), 'default', array('class' => 'error-message'));

				if(!$id_paciente){
					$this->redirect('/calendarios/semanal/'.$this->data['Turn']['fecha']['year'].'/'.$this->data['Turn']['fecha']['month'].'/'.$this->data['Turn']['fecha']['day'].'/'.$this->data['Turn']['doctor_id']);
					exit;
				}else{
//					$this->redirect('/people/view/'.$id_paciente.'/99');
					// $this->redirect('/dashboards');

					$this->redirect('/calendarios/semanal/'.$this->data['Turn']['fecha']['year'].'/'.$this->data['Turn']['fecha']['month'].'/'.$this->data['Turn']['fecha']['day'].'/'.$this->data['Turn']['doctor_id']);
					exit;
				}
				exit;
			}

			// Si el Paciente se selecciono y el Paciente es Temporario
			if(!empty($this->data['Turn']['person_id']) AND $esPacienteTemporario == "S"){
				$this->data['Turn']['person_id'] = 0;
			}

			$this->Turn->create();

			// Seteo datos que no vienen del Formulario
			$this->Turn->set(array(
				'client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
				'user_id' => $this->Auth->user('id'),
				'nota' => $nota,
				'nota_json' => $nota_json,
				'stateturn_id' => '1',
				'sobreturno' => $esSobreturno,
				'confirm' => date("Y-m-d H:i:s")
			));

			if ($this->Turn->save($this->data)) {

				// Se actualizan las Sesiones
				$this->actualizarTurnos();

				//-------- Elimino el seteo de PacienteSeleccionado
				$this->Session->write('PacienteSeleccionado', ''); 

				$agenda_id = $this->data['Turn']['agenda_id'];

				if( $this->data['Turn']['stateturn_id']==2){
					// Vino de Demanda espontanea
					// Si es una Persona Temporaria
					if($this->data['Turn']['person_id'] == 0){
						$this->Session->setFlash(__('El Turno Temporario ha sido guardado', true));
						$this->redirect('/dashboards/index/0/0/'.$agenda_id);
						exit;
					}else{
						$this->Session->setFlash(__('El Turno ha sido guardado', true));
						$this->redirect('/dashboards/index/0/0/'.$agenda_id);
						exit;
					}
					
				} else {
					// Si es una Persona Temporaria
					if($this->data['Turn']['person_id'] == 0){
						$this->Session->setFlash(__('El Turno Temporario ha sido guardado', true));

						$this->redirect('/calendarios/semanal/'.$this->data['Turn']['fecha']['year'].'/'.$this->data['Turn']['fecha']['month'].'/'.$this->data['Turn']['fecha']['day'].'/'.$this->data['Turn']['doctor_id']);
						exit;
					}else{
						$this->Session->setFlash(__('El Turno ha sido guardado', true));
						//$this->redirect('/calendarios/semanal/'.$this->data['Turn']['fecha']['year'].'/'.$this->data['Turn']['fecha']['month'].'/'.$this->data['Turn']['fecha']['day'].'/'.$this->data['Turn']['doctor_id']);
						$this->redirect('/ingresos/');
						
						exit;
					}
				
				}
				
			} else {
				$this->Session->setFlash(__('El Turno no pudo ser guardado. Por favor, intente luego.', true));
			}
		}

		$Paciente = $this->Session->read('PacienteSeleccionado');
		$this->set('Paciente',$Paciente);
		
		if(empty($Paciente) or $Paciente['id']<1){
			$this->redirect('/ingresos/');
			die();
		}


		if($anio=='ESPONTANEA'){
			$this->set('fecha_completa', date("Y-m-d H:i"));
			$this->set('demanda_espontanea', "S");
		}else{
			$this->set('fecha_completa', "$anio-$mes-$dia $hora:$minutos");
			$this->set('demanda_espontanea', "N");			
		}


		//---------------------------------------------------------------
		//                Si no hay Profesional elegido, tomo el logueado
		//---------------------------------------------------------------
		if(!$id_profesional){ 
			$profesional_id = $this->Session->read('ProfesionalSeleccionado');
		 }
		$this->User->recursive = -1;
		$User = $this->User->read(null,$id_profesional);
		$this->Set('User',$User);
		
		
        // --- Obtiene los productos de ese medico
        $sql = "select products.id, products.name from products 
				left join products_users on products_users.product_id = products.id
				where products_users.user_id='$id_profesional' ";
        $xProductos = $this->Product->query($sql);
		$Productos = array();
		foreach($xProductos as $xp){
			$Productos[$xp['products']['id']] = $xp['products']['name'];
		}
		$this->set(compact('Productos'));
		
		//-------------------------------------------------------------------
		// Cuales son las Agendas de ese Medico?
		//-------------------------------------------------------------------
		$id_agenda  = $this->Session->read('AgendaSeleccionada');
		$ag = $this->Agenda->read(null,$id_agenda);
		$this->set('id_agenda', $id_agenda);
		$this->set('agenda_nombre', $ag['Agenda']['nombre']);

		
		$this->set(compact('people'));
		$this->set('id_profesional', $id_profesional);
		$this->set('sobreturno', $sobreturno);
	}

	
	
	
	
	
	
	function edit($id = null,$id_paciente = null) {

		$this->_accede('carga_turnos');

		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Invalid turn', true));
			$this->redirect(array('action' => 'index'));
		}
		if (!empty($this->data)) {

			// Seteo datos que no vienen del Formulario
			$this->Turn->set(array(
				'user_id' => $this->Auth->user('id'),
			));

			if ($this->Turn->save($this->data)) {
				$this->Session->setFlash(__('The turn has been saved', true));
				$this->redirect('/people/view/'.$this->data['Turn']['person_id'].'/99');
			} else {
				$this->Session->setFlash(__('The turn could not be saved. Please, try again.', true));
			}
		}
		if (empty($this->data)) {
			$this->data = $this->Turn->read(null, $id);
		}

		if (!$id_paciente) {
			exit;
		}

		$people = $this->Person->find('list', array(
						'fields' => array('Person.id', 'Person.full_name')
		) );

		$this->set('doctors',$this->requestAction('/users/obtenerListadoDoctores/'.$this->Session->read('ClientesUsuarioLogueado.id')) );
		$stateturns = $this->Turn->Stateturn->find('list');
		$this->set('id_paciente', $id_paciente);
		$this->set(compact('people', 'stateturns'));
	}

	function archivar($id = null, $id_paciente = null, $estado = null) {
		if (!$id) {
			$this->Session->setFlash(__('Turno no valido', true));
			$this->redirect('/dashboards');
		}

		if (!$id_paciente) {
			$this->Session->setFlash(__('Paciente no valido', true));
			$this->redirect('/dashboards');
		}

		if (!$estado) {
			$this->Session->setFlash(__('Estado no valido', true));
			$this->redirect('/dashboards');
		}

		$this->Turn->id = $id;
		$this->Turn->set(array(
			'staterecord_id' =>  $estado,
			'user_id' => $this->Auth->user('id'),
		));


		if ($this->Turn->save()) {
			$this->Session->setFlash(__('El Turno fue procesado.', true));
			$this->redirect('/people/view/'.$id_paciente.'/99');
		}
		$this->Session->setFlash(__('El Turno no pudo ser procesado', true));
		$this->redirect('/people/view/'.$id_paciente.'/99');
	}


	function proximos() {

		if(!$proximos_turnos = Cache::read('proximos_turnos_'.$this->Session->read('ClientesUsuarioLogueado.id').'_'.$this->Session->read('ProfesionalSeleccionado'))){

			$proximos_turnos = $this->Turn->find('all', array(
							'conditions' => array(
											'Turn.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
											'Turn.doctor_id' => $this->Session->read('ProfesionalSeleccionado'),
											'Turn.fecha BETWEEN ? AND ?' => array(date("Y-m-d"),date("Y-m-d",mktime(0,0,0,date("m"),date("d")+1,date("Y"))) ),
											'NOT' => array ('Turn.staterecord_id' => array('2','3'))
							),
							'order' => array('Turn.orden')
			));

            Cache::write('proximos_turnos_'.$this->Session->read('ClientesUsuarioLogueado.id').'_'.$this->Session->read('ProfesionalSeleccionado'), $proximos_turnos);
		}

		$this->set('turnos', $proximos_turnos);
		$this->set('doctores',$this->requestAction('/users/obtenerListadoDoctores/'.$this->Session->read('ClientesUsuarioLogueado.id')) );
		$this->set('stateturns',$this->Stateturn->find('list', array('order' => array('Stateturn.name'))) );
	}

	function actualizarTurnos(){
		Cache::delete('proximos_turnos_'.$this->Session->read('ClientesUsuarioLogueado.id').'_'.$this->Session->read('ProfesionalSeleccionado'));
		$this->autoRender=false;
	}

	// Cambia un Turno a un determinado Esstado
	function setEstadoTurno($id_turno = null, $id_paciente = null, $id_nuevo_estado = null) {
		// Si esta definido el Turno y el Paciente
		if (!empty($id_turno) AND !empty($id_paciente) AND !empty($id_nuevo_estado)){

			// Obtengo datos del Objeto
			$this->Turn->id = $id_turno;


			// Registro la hora de llegada del paciente
			if(empty($this->Turn->hora_llegada) AND $id_nuevo_estado == 2){
				$this->Turn->saveField('hora_llegada',date("Y-m-d H:i"));
			}

			// Registro la hora de atencion del paciente
			if(empty($this->Turn->hora_atendido) AND $id_nuevo_estado == 5){
				$this->Turn->saveField('hora_atendido',date("Y-m-d H:i"));
			}


			// Si lo pudo grabar
			if ($this->Turn->saveField('stateturn_id',$id_nuevo_estado)){

				// Se actualizan las Sesiones
				$this->actualizarTurnos();

				echo $id_nuevo_estado;
			}else{ // Si no pudo
				echo "N";
			}
		}
		$this->autoRender=false;
	}

	function cambiarestado($id = null, $id_paciente = null) {

		if ($id){

			// Averiguo los estados posibles de los Turnos
			if($id_paciente){ // Si el paciente ya está cargado en la BD

				$arreglo_estados_turnos = $this->Stateturn->find('list', array(
						'order' => array('Stateturn.id')
				));
			}else{ // Si es un Paciente TEMPORAL

				$arreglo_estados_turnos = $this->Stateturn->find('list', array(
						'conditions' => array(
											'Stateturn.id' => array('1','3'),
										),
						'order' => array('Stateturn.id')
				));
			}

			// Obtengo datos del Objeto
			$this->Turn->id = $id;
			$estado_actual = $this->Turn->field('stateturn_id');


			// Determino el Seguiente Estado a asignar
			if (array_key_exists($estado_actual, $arreglo_estados_turnos)){

				$valor_guardar = key($arreglo_estados_turnos);


				reset($arreglo_estados_turnos);
				foreach($arreglo_estados_turnos AS $indice => $valor_aux){

					// Si encontre el estado actual, entonces selecciono el siguiente posible
					if($indice == $estado_actual){

						// Si es el ultimo elemento de la lista
						if(next($arreglo_estados_turnos) === FALSE){
							reset($arreglo_estados_turnos);
						}

						$elem_actual = each($arreglo_estados_turnos);
						$valor_guardar = $elem_actual['key'];

						break;
					}
					next($arreglo_estados_turnos);
				}

			}else{
				reset($arreglo_estados_turnos);
				$elem_actual = each($arreglo_estados_turnos);
				$valor_guardar = $elem_actual['key'];
			}
			// Si lo pudo grabar
			if ($this->Turn->saveField('stateturn_id',$valor_guardar)){

				// Se actualizan las Sesiones
				$this->actualizarTurnos();

				echo $valor_guardar;
			}else{ // Si no pudo
				echo "N";
			}
		}
		$this->autoRender=false;
	}

	function ordenar(){
        if (isset($_POST['items'])){ 
            $sortableitems = $_POST['items']; 

            $i = 0; 
            foreach ($sortableitems as $item) 
            { 
                $this->Turn->id = $item; 
                $this->Turn->saveField('orden', $i); 
                $i++; 
            } 

			// Se actualizan las Sesiones
			$this->actualizarTurnos();
        } 
	}

	function cancelar($arreglo_id = null) {
	$this->_accede('cancela_turnos');
	
		// Si existen turnos para cancelar
		if ($arreglo_id) { 

			$arreglo_id_turnos = explode("|", $arreglo_id); 

			foreach($arreglo_id_turnos AS $id_turno_aux){

				if(!empty($id_turno_aux)){
					// Identifico el Turno
					$this->Turn->id = $id_turno_aux; 

					// Cancelo el Turno
					$this->Turn->saveField('stateturn_id', "3"); 
				}
			}

			// Se actualizan las Sesiones
			$this->actualizarTurnos();

			echo "S";
			exit;
		}else{
			echo "N";
			exit;
		}
	}

	function ObtenerTurnos($fecha_inicio = null, $fecha_fin = null, $profesional_id = null, $agenda_id=0) {

		$client_id      = $this->Session->read('ClientesUsuarioLogueado.id');
		$user_id        = $this->Auth->user('id');
		$sucursal_id    = $this->Session->read('Sucursal.id');

		$client_tz = new DateTimeZone($_SESSION['Client']['timezone']);
		$date      = new DateTime();
		$date->setTimezone($client_tz);



		// Si no esta definida la Fecha de Inicio => es HOY
		if(!$fecha_inicio){
			$fecha_inicio = date("Y-m-d",mktime(0,0,0,date("m"),date("d"),date("Y")));
		}
		$tz_fecha_inicio =  $date->format($fecha_inicio);				
		

		// Si no esta definida la Fecha de Fin => es HOY
		if(!$fecha_fin){
			$fecha_fin = date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d"),date("Y")));
		}
		$tz_fecha_fin =  $date->format($fecha_fin);


		if(!$agenda_id){

			//------------------------------------------------------------
			// Si no esta definida la Agenda, muestro los Turnos de Todos
			//                        Obtengo las agendas de esta sucursal
			//------------------------------------------------------------

			$xAgendas = $this->Agenda->find('all',array(
									'conditions'=>array(
										'Agenda.sucursal_id' => $sucursal_id,
										'NOT' => array ('Agenda.alcance' => 'pri'),
										'NOT' => array ('Agenda.staterecord_id' => array('2','3') )
									)
								));
			$Agendas = array();
			foreach ($xAgendas as $value) {
				$Agendas[$value['Agenda']['id']] = $value['Agenda']['id'];
			}

			$condicion_profesional = array(
										'Turn.client_id' => $client_id,
										'Turn.fecha BETWEEN ? AND ?' => array($tz_fecha_inicio,$tz_fecha_fin ),
										'Turn.agenda_id' => $Agendas,
										'NOT' => array ('Turn.staterecord_id' => array('2','3'))
									);



		} else {

			$condicion_profesional = array(
										'Turn.client_id' => $client_id,
										'Turn.agenda_id' => $agenda_id,
										'Turn.fecha BETWEEN ? AND ?' => array($tz_fecha_inicio,$tz_fecha_fin ),
										'NOT' => array ('Turn.staterecord_id' => array('2','3'))
									);

		}

		$this->Turn->unbindModel( array('belongsTo' => array('Client', 'User','Staterecord') ) );		

		$lst_turnos = $this->Turn->find('all', array(
						'conditions' => $condicion_profesional,
						'order' => array('Turn.fecha')
					));


		if($lst_turnos){

			foreach($lst_turnos as $clave=>$valor){

				if($valor['Agenda']['specialty_id']>0){
					$lst_turnos[$clave]['Turn']['nombre_agenda'] = $valor['Agenda']['nombre'];					
				} else {
					$lst_turnos[$clave]['Turn']['nombre_agenda'] = $valor['Doctor']['tratamiento'].' '.$valor['Doctor']['lastname'].', '.$valor['Doctor']['name'];
				}

			}
		}		


		return $lst_turnos;
	}

	function listadoturnos($fecha_inicio = null, $fecha_fin = null, $profesional = null){

		if(!$fecha_inicio){
			$fecha_inicio = date("Y-m-d");
		}

		if(!$fecha_fin){

			$anio_inicio = substr($fecha_inicio, 0, 4);
			$mes_inicio = substr($fecha_inicio, 5, 2);
			$dia_inicio = substr($fecha_inicio, 8, 2);

			$fecha_fin = date("Y-m-d",mktime(0,0,0,$mes_inicio,$dia_inicio+1,$anio_inicio));
		}

		$listado_turnos = $this->ObtenerTurnos($fecha_inicio, $fecha_fin, $this->Session->read('ProfesionalSeleccionado'));

		$this->set('listado_turnos', $listado_turnos);
		$this->set('listado_productos', $this->Product->find('list'));
	}
}
?>